#include "SOR.h"

double SOR_num_flops(int M, int N, int num_iterations)
{
    double Md = (double)M;
    double Nd = (double)N;
    double num_iterD = (double)num_iterations;

    return (Md - 1) * (Nd - 1) * num_iterD * 6.0;
}

void SOR_execute(int M, int N, double omega, double **G, int num_iterations)
{

    double omega_over_four = omega * 0.25;
    double one_minus_omega = 1.0 - omega;

    /* update interior points */

    int Mm1 = M - 1;
    int Nm1 = N - 1;
    int p;
    int i;
    int j;
    double *Gi;
    double *Gim1;
    double *Gip1;

    for (p = 0; p < num_iterations; p++)
    {
        for (i = 1; i < Mm1; i++)
        {
            Gi = G[i];
            Gim1 = G[i - 1];
            Gip1 = G[i + 1];
            for (j = 1; j < Nm1; j++)
                Gi[j] = omega_over_four * (Gim1[j] + Gip1[j] + Gi[j - 1] + Gi[j + 1]) + one_minus_omega * Gi[j];
        }
    }
}
